/*
 * Copyright (c) 2021，上海福宇龙汽车科技有限公司
 * All rights reserved.
 * 文件名称: lock_uart.h
 * 摘要:
 * 当前版本: V1.0.0 zhouwei
 * Date: 2024-03-12
 * 历史版本: Vx.x.x，编写者/修改者，修改时间，修改内容（重大发布时，总结重点变更内容）
 */
#ifndef _LOCK_UART_H
#define _LOCK_UART_H
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include "rte.h"
/*方向锁串口协议字节长度*/
#define LOCK_UART_NUM (6U)
/*方向锁接受最大延时*/
#define LOCK_ACCEPT_MAX_DELMS (150U)
/*方向锁等待上锁延时*/
#define LOCK_WAIT_LOCKMS (5000U)
/*方向锁磨合延时*/
#define TELES_TEST_DELMS (500U)
/*方向锁磨合次数*/
#define TELES_TEST_NUM (5U)

/*方向锁测试，全部通用Test_Fixture请求DATA*/
#define EHBL_REQUEST_DATA (0x00000001)
/*方向锁测试，闭锁Test_Fixture请求DATA*/
#define EHBL_LOCK_REQUEST_DATA (0x01000001)
/*方向锁测试，解锁Test_Fixture请求DATA*/
#define EHBL_UNLOCK_REQUEST_DATA (0x01000002)
/*方向锁测试，全部通用EHBL回复成功DATA*/
#define EHBL_RSP_DATA_OK (0x00000001)
/*方向锁测试，全部通用EHBL回复失败DATA*/
#define EHBL_RSP_DATA_FAIL (0x00000002)

/*硬件版本CMD*/
#define HARDWARE_VERSION_CMD (0x1109)
/*软件版本CMD*/
#define SOFTWARE_VERSION_CMD (0x1110)

/*输入测试CMD*/
#define INPUT_TEST_CMD (0x1111)

/*查询锁状态CMD*/
#define QUERY_CMD (0x1102)

/*查询锁为闭锁状态data*/
#define QUERY_UNLOCK_DATA (0x00000001)

/*查询锁为解锁状态data*/
#define QUERY_LOCK_DATA (0x00000002)

/*查询锁为中间状态data*/
#define QUERY_MIDDLE_DATA (0x00000003)

/*查询锁为错误状态data*/
#define QUERY_ERR_DATA (0x00000004)

/*闭锁测试CMD*/
#define LOCK_TEST_CMD (0x1101)
/*标定测试CMD*/
#define CALIBRATION_TEST_CMD (0x1113)
/*标定接受CMD*/
#define CALIBRATION_RSP_CMD (0x1108)

/*解锁测试CMD*/
#define UNLOCK_TEST_CMD (0x1101)
/*解锁标定测试CMD*/
#define UN_CALIBRATION_TEST_CMD (0x1115)
/*解锁标定接受测试CMD*/
#define UN_CALIBRATION_RSP_CMD (0x1107)

/*使EHBL退出EOL模式*/
#define EHBL_QUIT_EOL_CMD (0x1112)

/*锁伸出情况下最大值mm*/
#define LOCK_EXT_MAX 14.10f
/*锁伸出情况下最小值mm*/
#define LOCK_EXT_MIN 12.90f
/*锁未伸出情况下最大值mm*/
#define LOCK_NOT_EXT_MAX 5.10f
/*锁未伸出情况下最小值mm*/
#define LOCK_NOT_EXT_MIN 3.50f
/*锁误差mm*/
#define LOCK_TONE_PITCH 0.30f

typedef enum
{
    COMMUNICATION_TEST, /*通讯测试*/
    UNLOCK_TEST,        /*解锁标定测试*/
    TELES_TEST,         /*伸缩测试*/
    INPUT_TEST,         /*输入测试*/
    LOCK_TEST,          /*闭锁标定测试*/
    PROHIBIT_LOCK_TEST, /*禁止上锁测试*/
    EHBL_INIT,           /*初始化为解锁状态*/
    EHBL_DURING_TEST,    /*循环次数测试*/
    EHBL_QUIT_EOL,      /*使EHBL退出EOL模式*/
    EHBL_MAX            /*最大值，暂无测试阶段*/
} EHBL_stage;           /*EHBL测试阶段*/

typedef enum
{
    INPUT_VERSION, /*输入阶段*/
    UNLOCK_VERSION /*上锁禁止阶段*/
} EHBL_I_stage;    /*输入测试，输入和禁止上锁*/

typedef enum
{
    LOCK_OR_UNLOCK_STAGE, /*闭锁或者解锁阶段*/
    CALIBRATE_STAGE,      /*标定阶段*/
    QUERY_STAGE          /*查询阶段*/
} EHBL_Lock_stage;        /*闭锁或者解锁测试_闭锁和标定阶段*/

typedef enum
{
    IS_UNLOCK, /*未上锁，解锁状态*/
    IS_LOCK,  /*已上锁,闭锁状态*/
    IS_WAIT  /*等待*/
} Is_locked;  /*EHBL是否闭锁*/

typedef union
{
    uint8_t L_data[LOCK_UART_NUM]; /*串口数据*/
    struct
    {
        uint32_t DATA;
        uint16_t CMD;
    } sig;
} Lock_test_data;

typedef struct
{
    
    Com_softhard_stage v_stage; /*EHBL通信测试版本号测试,软硬件阶段*/
    uint8_t Error_record;       /*EHBL通信测试版本号测试,硬件软件错误计数*/
    bool EHBL_send_data_only;   /*EHBL通讯测试软硬件版本号,只发送一次请求标志位*/
    EHBL_I_stage I_stage;       /*EHBL输入测试,输入和上锁禁止阶段*/
    EHBL_Lock_stage L_stage;    /*EHBL闭锁标定测试,闭锁、标定阶段*/
    uint8_t Unlock_first;   /*EHBL禁止上锁前先将锁复位到解锁状态*/
    EHBL_Lock_stage UL_stage;   /*EHBL解锁标定测试,解锁、标定阶段*/
} EHBL_flag;                    /*方向锁各阶段标志位*/

typedef struct
{
    Is_locked locked;          /* 锁状态 */
    uint8_t TELES_num;         /* 磨合伸缩测试次数 */
    EHBL_stage E_st;           /*EHBL测试阶段*/
    Rt_result e_sta[EHBL_MAX]; /*6-10各阶段具体结果情况*/
    Rt_result EHBL_ver_comp;    /*方向锁测试版本号比较结果*/
    Rt_result EHBL_results;    /*方向锁测试步骤6-10是否流程走完*/
    Rt_result EHBL_Eol;         /*EHBL退出EOL模式是否需要执行*/
    Lock_test_data Test_Fixture; /*Test_Fixture请求帧*/
    Sent_received_flag Sflag;    /*Test_Fixture请求帧串口发送标志*/
    Lock_test_data Ehbl_resp;    /*EHBL应答帧*/
    Sent_received_flag Rflag;    /*EHBL应答帧串口接受标志*/
    EHBL_flag E_flag; /*方向锁各阶段标志位*/
} EHBL_test;

/*
 * 函数介绍: 方向锁串口接受回调函数
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Ehbl_uart_cbk(uint16_t cmd, uint8_t data[]);

    /*
     * 函数介绍: 方向锁相关初始化
     * 参数:
     * 返回值: {*}
     * 备注:
     */
void ehbl_init(void);

/*
 * 函数介绍: 修改EHBL测试阶段
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Modify_EHBL_testing_phase(EHBL_stage phase);

/*
 * 函数介绍: EHBL功能测试
 * 参数:
 * 返回值: {*}
 * 备注:
 */
Rt_result EHBL_functional_test(void);

/*
 * 函数介绍: EHBL通用请求应答函数
 * 参数:
 * 返回值: {*}
 * 备注:
 */
Rt_result EHBL_universal_Req_Rsp(uint16_t ReqCmd, uint16_t RspCmd, uint32_t Req_data, uint32_t Rsp_data_ok);

EHBL_stage Get_EHBL_testing_phase(void);
#endif
